﻿// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.

using System;

namespace Microsoft.Practices.EnterpriseLibrary.Validation.Validators
{
    /// <summary>
    /// Marks a method as implementing self validation logic.
    /// </summary>
    /// <remarks>
    /// The following conditions must be met for a method to be considered for self validation:
    /// <list type="number">
    /// <item><term>The type for which the validation is being created must have the <see cref="HasSelfValidationAttribute"/>.</term></item>
    /// <item><term>The method must have the <see cref="SelfValidationAttribute"/> with configured for the requested ruleset.</term></item>
    /// <item><term>The method must be void and take a single parameter of type <see cref="ValidationResults"/>.</term>term></item>
    /// </list>
    /// <para/>
    /// Non-public methods can be used for self validation, although inherited non-public methods will not be used.
    /// <para/>
    /// There is no configuration based way to specify self validation.
    /// </remarks>
    /// <seealso cref="SelfValidationValidator"/>
    /// <seealso cref="HasSelfValidationAttribute"/>
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
    public sealed class SelfValidationAttribute : Attribute
    {
        private string ruleset = string.Empty;

        /// <summary>
        /// Gets or set the ruleset for which the self validation method must be included.
        /// </summary>
        public string Ruleset
        {
            get { return ruleset; }
            set { ruleset = value; }
        }

        private readonly Guid typeId = Guid.NewGuid();

        /// <summary>
        /// Gets a unique identifier for this attribute.
        /// </summary>
        public override object TypeId
        {
            get
            {
                return this.typeId;
            }
        }
    }
}
